package controllers;

import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.imageio.ImageIO;

import controllers.Secure.Security;
import models.AcessoNegadoException;
import models.Administrador;
import models.Cliente;
import models.InterfaceAdministracao;
import models.ItemPedido;
import models.Pedido;
import models.Produto;
import models.SenhaIncorretaException;
import models.ServicosAdministracao;
import models.TipoUsuario;
import models.UsuarioBloqueadoException;
import models.dados.ChaveRepetidaException;
import models.dados.DadoNaoEncontradoException;

import play.data.validation.Required;
import play.mvc.*;

@With(Secure.class)
public class Administracao extends Controller {

	public static InterfaceAdministracao servicosAdministracao = ServicosAdministracao
			.getInstancia();

	public static void login() {
		
		render();

	}
	


	public void logout() {
		SegurancaAdministracao.onDisconnect();
	}

	public static void inicial_administracao() {

		String usuario = Security.connected();

		render(usuario);
	}


	
	public static void cadastro_administrador(){
		
		 render();
	}

	public static void cadastrarAdministrador(@Required String  nomeUsuario, @Required String senha1, @Required String senha2,@Required String tipoUsuario){
		if(validation.hasErrors()){
			flash.error("campo obrigatorio");
			Administracao.cadastro_administrador();
		}
		if(!senha1.equals(senha2)){
			flash.error("As senhas não coincidem",senha2);
			Administracao.cadastro_administrador();
		}
		TipoUsuario tipoAdministrador = TipoUsuario.ADM_WEB;
		if(tipoUsuario.equals("adm_super")){
			tipoAdministrador = TipoUsuario.ADM_SUPER;
		}
		if(tipoUsuario.equals("adm_vendas")){
			tipoAdministrador = TipoUsuario.ADM_VENDAS;
		}

		try {
			servicosAdministracao.cadastrarAdministrador(nomeUsuario, senha1, tipoAdministrador, Security.connected());
		} catch (DadoNaoEncontradoException e) {
			forbidden();
		} catch (AcessoNegadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ChaveRepetidaException e) {
			flash.error("Este nome de usuário já está em uso");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Administracao.inicial_administracao();
	}
	public static void cadastro_donut() {
		render();
	}
	
	public static void alterarDonut(String nome,String novoNome,double preco,File imagem) throws IOException{
		try {
			servicosAdministracao.alterarProduto(nome, novoNome, preco, imagem, Security.connected());
			System.out.println(imagem.getName());
			Administracao.inicial_administracao();
		} catch (DadoNaoEncontradoException e) {
			// TODO Auto-generated catch block
			
		}
		
	}
	
	
	public static void lista_administradores(String sit){
		List<Administrador> administradores = servicosAdministracao.listarAdministradores(Security.connected(),null,null ,null,null,false,true,true,false);
		
		render(administradores);
	}
	
	public static void lista_clientes() throws DadoNaoEncontradoException{
		List<Cliente> clientes=null;
		try {
			clientes = servicosAdministracao.listarClientes(null, null, null, null, null, false,true, true,true, Security.connected());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		render(clientes);
	}
	
	
	
	public static void detalhes_administrador(String nomeUsuario){
		try {
			Administrador adm = servicosAdministracao.pesquisarAdministrador(nomeUsuario);
			String usuario= adm.getNomeUsuario();
			String estaAtivo = "Ativo";
			if(!adm.estaAtivo()){
				estaAtivo="Inativo";
			}
			GregorianCalendar data = (GregorianCalendar) adm.getDataCadastro();
			String dataCadastro = String.format("%d/%d/%d as %d:%d", data.get(Calendar.DAY_OF_MONTH),
					data.get(Calendar.MONTH),data.get(Calendar.YEAR),data.get(Calendar.HOUR_OF_DAY),
					data.get(Calendar.MINUTE));
			render(usuario,estaAtivo,dataCadastro);
			
			
			
		} catch (DadoNaoEncontradoException e) {
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// Falta tratar o caso das imagens com o mesmo nome
	public static void cadastrarDonut(double preco, String sabor, File foto)
			throws IOException {
		try {
			RenderedImage bf = ImageIO.read(foto.getCanonicalFile());

			ImageIO.write(bf, "png", new File(
					"Donuts Mania/public/images/donuts/" + foto.getName()));

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			servicosAdministracao.cadastrarDonut("Donut", sabor, preco,
					foto.getName(), new Date(), Security.connected());
			Administracao.confirmacao_cadastro();
		} catch (ChaveRepetidaException e) {
			forbidden("Ja cadastrado");

		} catch (AcessoNegadoException e1) {
			forbidden("Voce não pode fazer isto");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void confirmacao_cadastro(){
		render();
	}

	public static void lista_donuts() {
		List<Produto> donuts = null;
		try {
			donuts = servicosAdministracao.listarProdutos("Donut");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		render(donuts);
		

	}
	
	public static void alteracao_donut(String nomeDonut){
		Produto donut = servicosAdministracao.getProduto(null, null, nomeDonut);
		String nome = donut.getNome();
		String valor = String.format("R$ %.2f", donut.getPreco());
		String dataCadastro = String.format("%d/%d/%d",donut.getDataCadastro().get(Calendar.DAY_OF_MONTH),
				donut.getDataCadastro().get(Calendar.MONTH),
				donut.getDataCadastro().get(Calendar.YEAR));
		String dataUltimaAlteracao = null;
		if(donut.getDataUlimaAlteracao()!=null){
		    dataUltimaAlteracao = String.format("%d/%d/%d",donut.getDataUlimaAlteracao().get(Calendar.DAY_OF_MONTH),
				donut.getDataUlimaAlteracao().get(Calendar.MONTH),
				donut.getDataUlimaAlteracao().get(Calendar.YEAR));
		}
		String urlImagem = donut.getUrlImagem();
		String usuarioUltimaAlteracao = donut.getUsuarioUltimaAlteracao();
				
		
		render (nome,valor,dataCadastro,dataUltimaAlteracao,urlImagem,usuarioUltimaAlteracao);
		
	}

	/* 15/13/2005 */
	public static void lista_pedidos(String dataInicial, String dataFinal,
			String status) {
		String tipoPesquisa = status;
		Calendar a = null;
		Calendar b = null;
		if (dataInicial != null && !dataInicial.equals("")) {
			a = new GregorianCalendar(Integer.parseInt(dataInicial.substring(6,
					10)), Integer.parseInt(dataInicial.substring(3, 5)),
					Integer.parseInt(dataInicial.substring(0, 2)));
			b = new GregorianCalendar(Integer.parseInt(dataFinal.substring(6,
					10)), Integer.parseInt(dataFinal.substring(3, 5)),
					Integer.parseInt(dataFinal.substring(0, 2)));

		}
		List<Pedido> pedidos = null;
		if (status != null) {
			pedidos = servicosAdministracao.listarPedidos(-1, null, null, null, null, null, null, null, null, Security.connected());
			
		}
		render(pedidos, tipoPesquisa);

	}

	public static void cancelarPedido(long id) {
		try {
			servicosAdministracao.alterarStatusPedido(id, "cancelado", Security.connected());
		} catch (DadoNaoEncontradoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AcessoNegadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Administracao.lista_pedidos(null, null, "cancelado");

	}
	
	public static void verPedido(long id){
		try {
			servicosAdministracao.alterarStatusPedido(id, "visto", Security.connected());
		} catch (DadoNaoEncontradoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AcessoNegadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Administracao.lista_pedidos(null, null, "visto");
	}
	
	public static void enviarPedido(long id){
		try {
			servicosAdministracao.alterarStatusPedido(id, "enviado", Security.connected());
		} catch (DadoNaoEncontradoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AcessoNegadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Administracao.lista_pedidos(null, null, "enviado");
	}
	
	public static void efetivarPedido(long id){
		try {
			servicosAdministracao.alterarStatusPedido(id, "efetivado", Security.connected());
		} catch (DadoNaoEncontradoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AcessoNegadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Administracao.lista_pedidos(null, null, "efetivado");
	}

	public static void removerProduto(String tipo, String marca, String nome) {
		try {
			servicosAdministracao.removerProduto("Donut", "", nome,Security.connected());
		} catch (DadoNaoEncontradoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		Administracao.lista_donuts();
	}

	public static void alterarStatusPedido(long numero, String status) throws AcessoNegadoException {
		String st = status;
		try {
			Pedido pedido = servicosAdministracao.getPedido(numero,Security.connected());
			if (status.equalsIgnoreCase("Cancelar")) {
				st = "cancelado";
			}
			if (status.equalsIgnoreCase("Mudar para visto")) {
				st = "visto";
			}
			if (status.equalsIgnoreCase("Enviar")) {
				st = "enviado";
			}
			if(status.equalsIgnoreCase("Efetivar")){
				st= "efetivado";
			}

			pedido.setStatus(st);
			servicosAdministracao.alterarStatusPedido(pedido.getNumero(), st, Security.connected());
			Administracao.pagina_pedido(numero);

		} catch (DadoNaoEncontradoException e) {

			Secure.forbidden();
		}

	}

	public static void pagina_pedido(long numero) {
		try {

			System.out.println(numero);
			Pedido pedido = servicosAdministracao.getPedido(numero,Security.connected());
			GregorianCalendar dt = (GregorianCalendar) pedido.getDataPedido();
			String data = dt.get(Calendar.DAY_OF_MONTH) + "/"
					+ dt.get(Calendar.MONTH) + "/" + dt.get(Calendar.YEAR);
			List<ItemPedido> lista = pedido.getItens();
			GregorianCalendar dataAlteracao = (GregorianCalendar) pedido
					.getDataUltimaAlteracao();
			String dataUltimaAlteracao = "sdfs";
			if (dataAlteracao != null) {
				dataUltimaAlteracao = String.format(
						"%d/%d/%d às %d horas e %d minutos",
						dataAlteracao.get(Calendar.DAY_OF_MONTH),
						dataAlteracao.get(Calendar.MONTH),
						dataAlteracao.get(Calendar.YEAR),
						dataAlteracao.get(Calendar.HOUR_OF_DAY),
						dataAlteracao.get(Calendar.MINUTE));
			}
			render(pedido, lista, data, dataUltimaAlteracao);

		} catch (DadoNaoEncontradoException e) {
			forbidden();
		}

	}

}
